function BUMAPI_resultForCallback() {
	bum.api.processCallback(arguments);
}

bum.api = {
	hasAPK : !(typeof BUMAPK === 'undefined'),
	hasWINS : (typeof (window.external) !== "undefined") && (typeof (window.external.notify) !== "undefined"),
	apv : 1,
	cid : $('body').attr('cid'),
	did : $('body').attr('did'),

	/**
	 * CALLBACKS
	 */
	callbackId : 0,
	callbacks : {},
	resultForCallback : function() {
		this.processCallback(arguments);
	},
	processCallback : function(agrs) {
		try {
			var callbackId = agrs[0];
			var callback = this.callbacks[callbackId];
			if (!callback) {
				return;
			}
			callback.apply(null, Array.prototype.slice.call(agrs, 1));

			callback = null;
			delete this.callbacks[callbackId];

			callbackId = null;
		} catch (e) {

		}
	},

	callNative : function(funcName) {
		/**
		 * Bỏ tham số đầu là functionName
		 */
		var args = Array.prototype.slice.call(arguments, 1);

		/**
		 * Callback
		 */
		if (typeof args[args.length - 1] == "function") {
			var a = ++this.callbackId;
			this.callbacks[a] = args[args.length - 1];
			args[args.length - 1] = a;
		}

		if (this.hasAPK) {
			if (typeof BUMAPK[funcName] == "function") {
				if (bum.isDebug) {
					try {
						BUMAPK.showToast(funcName + " " + args);
					} catch (e) {
					}
				}

				try {
					return BUMAPK[funcName].apply(BUMAPK, args);
				} catch (e) {
					if (bum.isDebug) {
						BUMAPK.showToast(e);
					}
				}

			}
			return true;
		}

		if (this.hasWINS) {
			var a = funcName + ':' + JSON.stringify(args);
			window.external.notify(a);

			// clear
			a = null;

			return true;
		}

		/**
		 * Tiến hành gọi kiểu ip Lưu ý gọi kiểu ip thì ko có dữ liệu trả về Cho nên phải truyền theo callback, để trên kia biết cái mà gọi trả về
		 */
		// var a = 'BUMIP:' + funcName + ':' + encodeURIComponent(JSON.stringify(args));
		//
		// // $('#debug').removeClass('hide').text(a);
		//
		// $('<iframe/>', {
		// 'src' : a,
		// 'class' : 'hide',
		// 'width' : '1px',
		// 'height' : '1px'
		// }).appendTo(document.body).remove();
		// a = null;
		return true;
	},
};

bum.api.fetchUrl = function(url, headers, callback) {
	if (bum.api.cid === 'FCBA35ED') {
		$.ajax({
			url : '/fetch',
			data : {
				url : url,
				headers : headers
			},
			jsonp : 'callback',
			dataType : 'jsonp',
			success : callback
		});
	} else {
		bum.api.callNative("fetchUrl", url, headers, callback);
	}
};

bum.api.fetchHttpUrl = function(url, method, postData, headers, callback) {
	bum.api.callNative("fetchHttpUrl", url, method, postData, headers, callback);
};

bum.api.showToast = function(msg) {
	bum.api.callNative("showToast", msg);
};

bum.api.openHttp = function(url) {
	bum.api.callNative("openHttp", url);
};

bum.api.playVideoUrl = function(url, title, uid) {
	bum.api.callNative("playVideoUrl", url, title, uid);
};